/**
 * @file GPS日志适配器
 * @description 将原始GPS日志数据转换为标准化的数据结构
 * @author GPS轨迹可视化系统
 * @date 2024-03-01
 */

import { Injectable } from '@nestjs/common';
import { RawGpsLogData } from '../interfaces/raw-gps-log-data.interface';
import { GpsLogData } from '../interfaces/gps-log-data.interface';

@Injectable()
export class GpsLogAdapter {
  /**
   * 将原始GPS日志数据转换为标准化的GPS日志数据
   * @param rawData 原始GPS日志数据
   * @returns 标准化后的GPS日志数据
   */
  adapt(rawData: RawGpsLogData): GpsLogData {
    // 处理时间格式转换（原始格式："02-09 08:24:05" → Date对象）
    const [month, day, time] = rawData.datetime.split(/[- ]/);
    const year = new Date().getFullYear(); // 假设为当前年份
    
    // 创建Date对象而不是ISO字符串，确保MongoDB正确存储
    const dateObj = new Date(`${year}-${month}-${day}T${time}Z`);

    // 处理坐标数据 - 从position字段获取数据来源，而不是gps
    // GpsData接口中没有source属性，应该从position字段获取
    let positionSource: 'gps' | 'lbs' | null = rawData.position?.source || null;
    
    // 优先使用已处理的position字段
    let position = { lng: 0, lat: 0 };
    let speed = 0;
    let isFix = false;
    
    if (rawData.position) {
      // 使用已处理的position字段
      position = { 
        lng: rawData.position.lng, 
        lat: rawData.position.lat 
      };
      speed = rawData.position.speed || 0;
      isFix = rawData.position.isFix;
      positionSource = rawData.position.source;
    } else if (rawData.gps?.lng !== undefined && rawData.gps?.lat !== undefined) {
      // 使用gps字段作为备选
      position = { 
        lng: rawData.gps.lng, 
        lat: rawData.gps.lat 
      };
      speed = rawData.gps.speed || 0;
      isFix = rawData.gps.isFix;
      positionSource = 'gps'; // 如果使用gps字段，则来源为gps
    }

    // 使用originalPosition作为original
    const original = rawData.originalPosition;

    return {
      deviceId: rawData.imei,
      timestamp: dateObj, // 直接使用Date对象而非字符串
      position,
      ...(original && { original }), // 只有在original存在时才添加此字段
      speed,
      battery: rawData.vbatt ? rawData.vbatt / 1000 : undefined,
      signal: rawData.csq,
      isFix,
      positionSource,
      positionValid: !!position.lng && !!position.lat
    };
  }
} 